/**
  ******************************************************************************
  * @file    main.c
  * @author  ashuai0110
  * @version V2.0
  * @date    2024-09-25
  * @brief   使用举例-FLASH模拟EEPROM
  *
  ******************************************************************************
  * @attention
  *
  * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^
  * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module
  *
  ******************************************************************************
  */

/* 包含头文件-----------------------------------------------------------------*/
#include "bsp.h"

#include "eeprom_emulation.h"

/* 私有宏定义-----------------------------------------------------------------*/
/* 参数具体释义详见源码 */
#define FLASH_EE_PAGE_START_ADDR1       (0x8005000u) /* 管理页1起始地址 */
#define FLASH_EE_PAGE_START_ADDR2       (0x8005800u) /* 管理页2起始地址 */
#define FLASH_EE_PAGE_SIZE              (0x400u)     /* FLASH单页大小 */
#define FLASH_EE_PAGE_TOTAL             (2u)         /* 管理的页数 */
#define FLASH_EE_PROGRAM_SIZE           (2u)         /* FLASH单次写入字节 */
#define FLASH_EE_VIRT_ADDR_TOTAL        (3u)         /* 已使用的虚拟地址数量 */

/* 私有类型定义---------------------------------------------------------------*/

/* 私有变量-------------------------------------------------------------------*/
/* 虚拟地址数组 组件要求使用的虚拟地址必须从0开始递增 */
static uint16_t flashVirtAddr[FLASH_EE_VIRT_ADDR_TOTAL] = {0, 1, 2};
static eeprom_em_t flashEE; /* EEPROM管理实例 */
/* 用户数据 */
static uint16_t userData1;   /* 使用虚拟地址0 */
static uint32_t userData2;   /* 使用虚拟地址1 */
static uint8_t userData3[5]; /* 使用虚拟地址2 */

/* 全局变量-------------------------------------------------------------------*/

/* 私有函数原型---------------------------------------------------------------*/


/**
  * @brief  This function handles SysTick Handler.
  *
  * @param  None
  *
  * @retval None
  */
void SysTick_Handler(void)
{
    /* 组件计时节拍接口 */
    mw_tick_inc(1);
}

/**
  * @brief  main
  */
int main(int argc, char *argv[])
{
    MW_VER_LOG("example-eeprom_emulation", 2, 0, 0);
    
    /* BSP初始化 */
    bsp_init();
    
    uint8_t ret;
    /* 模拟EEPROM初始化 参数具体释义及要求详见源码 */
    ret = eeprom_em_init(&flashEE, FLASH_EE_PAGE_START_ADDR1, FLASH_EE_PAGE_START_ADDR2, FLASH_EE_PAGE_SIZE, FLASH_EE_PROGRAM_SIZE, \
        FLASH_EE_PAGE_TOTAL, FLASH_EE_VIRT_ADDR_TOTAL, bsp_flash_erase, bsp_flash_read, bsp_flash_write);
    if(MW_RET_OK != ret)
    {
        MW_ERROR_LOG("eeprom_em_init failure!");
    }
    
    uint8_t readBufTmp[5];
    uint8_t cnt = 0;
    
    /* 先读取flash内是否已有用户数据,若没有则赋初始值,若有则继续累加 */
    /* 读取用户数据1 使用虚拟地址0 */
    ret = eeprom_em_read(&flashEE, flashVirtAddr[0], (void *)&userData1, sizeof(userData1));
    if(MW_RET_OK != ret)
    {
        MW_ERROR_LOG("user data1 read error %d!", ret);
        userData1 = 10000;
    }
    /* 读取用户数据2 使用虚拟地址1 */
    ret = eeprom_em_read(&flashEE, flashVirtAddr[1], (void *)&userData2, sizeof(userData2));
    if(MW_RET_OK != ret)
    {
        MW_ERROR_LOG("user data2 read error %d!", ret);
        userData2 = 2000000;
    }
    /* 读取用户数据3 使用虚拟地址2 */
    ret = eeprom_em_read(&flashEE, flashVirtAddr[2], (void *)userData3, sizeof(userData3));
    if(MW_RET_OK != ret)
    {
        MW_ERROR_LOG("user data3 read error %d!", ret);
        memset((void *)userData3, 0, sizeof(userData3));
    }
    
    while(cnt++ < 20)
    {
        userData1++;
        userData2++;
        userData3[0]++;
        
        /* 写入用户数据1 使用虚拟地址0 */
        ret = eeprom_em_write(&flashEE, flashVirtAddr[0], (void *)&userData1, sizeof(userData1));
        if(MW_RET_OK != ret)
        {
            MW_ERROR_LOG("user data1 write error %d!", ret);
        }
        /* 写入用户数据2 使用虚拟地址1 */
        ret = eeprom_em_write(&flashEE, flashVirtAddr[1], (void *)&userData2, sizeof(userData2));
        if(MW_RET_OK != ret)
        {
            MW_ERROR_LOG("user data2 write error %d!", ret);
        }
        /* 写入用户数据3 使用虚拟地址2 */
        ret = eeprom_em_write(&flashEE, flashVirtAddr[2], (void *)userData3, sizeof(userData3));
        if(MW_RET_OK != ret)
        {
            MW_ERROR_LOG("user data3 write error %d!", ret);
        }
        
        /* 读取用户数据1 使用虚拟地址0 */
        ret = eeprom_em_read(&flashEE, flashVirtAddr[0], (void *)readBufTmp, sizeof(userData1));
        if(MW_RET_OK != ret)
        {
            MW_ERROR_LOG("user data1 read error %d!", ret);
        }
        else
        {
            MW_PRINT_FUNC("no.%d read user data1:%d, ", cnt, *(uint16_t *)readBufTmp);
        }
        /* 读取用户数据2 使用虚拟地址1 */
        ret = eeprom_em_read(&flashEE, flashVirtAddr[1], (void *)readBufTmp, sizeof(userData2));
        if(MW_RET_OK != ret)
        {
            MW_ERROR_LOG("user data2 read error %d!", ret);
        }
        else
        {
            MW_PRINT_FUNC("data2:%d, ", *(uint32_t *)readBufTmp);
        }
        /* 读取用户数据3 使用虚拟地址2 */
        ret = eeprom_em_read(&flashEE, flashVirtAddr[2], (void *)readBufTmp, sizeof(userData3));
        if(MW_RET_OK != ret)
        {
            MW_ERROR_LOG("user data3 read error %d!", ret);
        }
        else
        {
            MW_PRINT_FUNC("data3:%d %d %d %d %d\r\n", readBufTmp[0], readBufTmp[1], readBufTmp[2], readBufTmp[3], readBufTmp[4]);
        }
        
        mw_delay_ms(500);
    }
    
    while(1)
    {

    }
}

